/**
 * 
 */
package fr.gfi.agraf.vue.action.login;

import java.util.Map;

import org.apache.log4j.Logger;
import org.apache.struts2.dispatcher.SessionMap;
import org.apache.struts2.interceptor.SessionAware;
import org.springframework.util.StringUtils;

import com.opensymphony.xwork2.ActionSupport;

import fr.gfi.agraf.exception.AgrafException;
import fr.gfi.agraf.service.IUtilisateurService;
import fr.gfi.agraf.utils.PropertiesUtils;
import fr.gfi.agraf.utils.SpringFactory;
import fr.gfi.agraf.vue.bean.UtilisateurDTO;

/**
 * @author Zakaria
 *
 */
public class LoginAction extends ActionSupport implements SessionAware {

	/**
	 * Logger
	 */
	private final static Logger LOGGER = Logger.getLogger(LoginAction.class);
	
	private static final String ERREUR_SAISIE_PASSWORD = "erreur.saisie.password";

	private static final String ERREUR_SAISIE_LOGIN = "erreur.saisie.login";

	public static final String UTILISATEUR = "utilisateur";
	
	public static final String PROFIL_CONNECTE = "profil_connecte";

	public static final String UTILISATEUR_SERVICE = "UtilisateurService";

	/**
	 * Généré par java
	 */
	private static final long serialVersionUID = 4086392629210605493L;

	/**
	 * Session
	 */
	private SessionMap<String, Object> sessionMap;
	private String login;
	private String password;

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.opensymphony.xwork2.ActionSupport#execute()
	 */
	@Override
	public String execute() throws Exception {
		// Spring, recupere le service utilisateur
		final IUtilisateurService utilisateurService = (IUtilisateurService) SpringFactory
				.getApplicationContext().getBean(UTILISATEUR_SERVICE);

		UtilisateurDTO utilisateurDTO = null;
		try {
			// Appel au service
			utilisateurDTO = utilisateurService
					.getUtilisateurParIdentification(login, password);
		} catch (final AgrafException ae) {
			// Recupére le message d'erreur
			final String messageErreur = PropertiesUtils.getProperty(ae
					.getKey());
			// Ajoute action error
			addActionError(messageErreur);
			LOGGER.error(messageErreur,ae);
			return ERROR;
		}
		// met l'utilisateur en session
		sessionMap.put(UTILISATEUR, utilisateurDTO);
		
		if (utilisateurDTO.getListeProfilDTO().size() == 1){
			sessionMap.put(PROFIL_CONNECTE, utilisateurDTO.getListeProfilDTO().get(0));
		}else{
			return "choixProfil";
		}
		
		return SUCCESS;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.opensymphony.xwork2.ActionSupport#validate()
	 */
	@Override
	public void validate() {
		// Verifie que le login a bien été saisie
		if (StringUtils.isEmpty(login)) {
			addActionError(PropertiesUtils.getProperty(ERREUR_SAISIE_LOGIN));
			return;
		}
		// Verifie que le mot de passe a bien été saisie
		if (StringUtils.isEmpty(password)) {
			addActionError(PropertiesUtils.getProperty(ERREUR_SAISIE_PASSWORD));
			return;
		}
		super.validate();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.apache.struts2.interceptor.SessionAware#setSession(java.util.Map)
	 */
	public void setSession(final Map<String, Object> session) {
		sessionMap = (SessionMap<String, Object>) session;
	}

	/**
	 * @return the login
	 */
	public String getLogin() {
		return login;
	}

	/**
	 * @param login
	 *            the login to set
	 */
	public void setLogin(final String login) {
		this.login = login;
	}

	/**
	 * @return the password
	 */
	public String getPassword() {
		return password;
	}

	/**
	 * @param password
	 *            the password to set
	 */
	public void setPassword(final String password) {
		this.password = password;
	}

}
